<?php
/**  
 * @file wx_message.php  
 * @author 辰然 <3469807212@qq.com>  
 * @created 2024年11月30日  
 * @signature "创意无限"  
 * @copyright Copyright (c) 2024 辰然. All rights reserved. 本软件版权归辰然所有，未经许可，不得开源或用于商业用途。  
 *  
 * 描述: 微信公众号消息处理
 * 注意: 根据版权声明，此代码允许开源。  
 */  
 
session_start(); // 确保启动 session

// 初始化 session 中的 tokens
if (!isset($_SESSION['tokens'])) {
    $_SESSION['tokens'] = [];
}

// 引入 TokenManager
require_once __DIR__ . '/TokenManager.php';
$tokenManager = new TokenManager();

// 验证微信服务器请求
function checkSignature() {
    $signature = $_GET["signature"];
    $timestamp = $_GET["timestamp"];
    $nonce = $_GET["nonce"];
    
    $token = "123456"; // 你的微信公众号 Token
    $tmpArr = array($token, $timestamp, $nonce);
    sort($tmpArr, SORT_STRING);
    $tmpStr = implode($tmpArr);
    $tmpStr = sha1($tmpStr);
    
    return $tmpStr === $signature;
}

// 生成新的 Token
function generateToken($openid) {
    global $tokenManager;
    $userInfo = [
        'openid' => $openid,
        'create_time' => time()
    ];
    $result = $tokenManager->generateToken($userInfo);
    return $result['token'];
}

 // 处理微信消息
function handleMessage($postStr) {
    global $tokenManager;
    $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
    $fromUsername = $postObj->FromUserName;
    $toUsername = $postObj->ToUserName;
    $keyword = trim($postObj->Content);
    $time = time();
    
    // 使用模糊匹配检查关键词
    if (preg_match('/(获取|申请|生成).*(token|令牌)/i', $keyword) || 
        stripos($keyword, 'token') !== false ||
        stripos($keyword, '令牌') !== false) {
        
        // 检查用户今天是否已经生成过token
        if ($tokenManager->hasUserGeneratedTokenToday((string)$fromUsername)) {
            $textTpl = "<xml>
                <ToUserName><![CDATA[%s]]></ToUserName>
                <FromUserName><![CDATA[%s]]></FromUserName>
                <CreateTime>%s</CreateTime>
                <MsgType><![CDATA[text]]></MsgType>
                <Content><![CDATA[您今天已经获取过Token了，请明天再试。]]></Content>
                </xml>";
                
            return sprintf($textTpl, $fromUsername, $toUsername, $time);
        }

        // 生成新的 Token
        $token = generateToken((string)$fromUsername);
        
        // 返回 Token 信息给用户
        $textTpl = "<xml>
            <ToUserName><![CDATA[%s]]></ToUserName>
            <FromUserName><![CDATA[%s]]></FromUserName>
            <CreateTime>%s</CreateTime>
            <MsgType><![CDATA[text]]></MsgType>
            <Content><![CDATA[您的访问 Token 已生成：\n%s\n\n有效期：3天\n请妥善保管]]></Content>
            </xml>";
            
        return sprintf($textTpl, $fromUsername, $toUsername, $time, $token);
    }
    
    // 其他关键词的处理...
    return "";
}
// 主程序
if (checkSignature()) {
    // 验证请求
    if (isset($_GET['echostr'])) {
        echo $_GET['echostr'];
        exit;
    }
    
    // 处理消息
    $postStr = file_get_contents("php://input");
    if (!empty($postStr)) {
        // 记录接收到的消息，方便调试
        error_log("Received message: " . $postStr);
        
        $resultStr = handleMessage($postStr);
        echo $resultStr;
        
        // 确保 session 被保存
        session_write_close();
    }
} else {
    echo "非法请求";
}
?>